package com.myk.game.heroscuffle.game;

import com.myk.game.heroscuffle.utils.SC;

/**
 * 英雄技能基类
 */
public abstract class Skill {

    /**
     * 技能名称
     */
    public final String SKILL_NAME;
    /**
     * 技能的效果描述
     */
    public final String DESCRIPTION;
    /**
     * 技能原始冷却时间，0以下为无冷却时间
     */
    public final int COOL_DOWN;
    /**
     * 技能原始使用次数限制，Integer.MAX_VALUE表示没有次数限制
     */
    public final int TIMES_LIMIT;

    /**
     * 持有英雄引用
     */
    public Hero hostHero;
    /**
     * 持有游戏引用
     */
    public Game game;
    /**
     * 剩余冷却时长
     */
    public int remnantCoolingTime;
    /**
     * 剩余可用次数
     */
    public int remnantUsableTimes;

    public Skill(String skillName, String description, int cooldown, int timesLimit) {
        this.SKILL_NAME = skillName;
        this.DESCRIPTION = description;
        this.COOL_DOWN = cooldown;
        this.TIMES_LIMIT = timesLimit;
    }

    /**
     * 技能准备就绪，剩余使用次数大于0，冷却时间小于0
     */
    public final boolean isReady() {
        return remnantCoolingTime < 0 && remnantUsableTimes > 0;
    }

    /**
     * 获取技能名称附带显示冷却时间和使用次数限制
     */
    public final String getDetailName(){
        String obvName = SKILL_NAME;
        if (COOL_DOWN>0||TIMES_LIMIT<Integer.MAX_VALUE){
            obvName += "\n(";
            if (COOL_DOWN>0){
                obvName += "cd:" + (remnantCoolingTime+1);
            }
            if (COOL_DOWN>0&&TIMES_LIMIT<Integer.MAX_VALUE){
                obvName += ",";
            }
            if (TIMES_LIMIT<Integer.MAX_VALUE){
                obvName += "tl:" + remnantUsableTimes;
            }
            obvName += ")";
        }
        return obvName;
    }

    /**
     * 技能准备
     */
    public final void init(Hero hostHero) {
        this.hostHero = hostHero;
        this.game = hostHero.game;
        remnantCoolingTime = COOL_DOWN;
        remnantUsableTimes = TIMES_LIMIT;
        hostHero.onSkillInit(this); //默认会在该方法里面回调 onInit()
    }

    /**
     * 技能状态更新
     */
    public final void update() {
        if (remnantCoolingTime >= 0) {
            remnantCoolingTime -= 1;
        }
        onUpdate();
        hostHero.onAfterSkillUpdate(this);
    }

    /**
     * 技能触发
     */
    public final void trigger() {
        game.ui.printlnMsg(hostHero.getObviousName() + "使用技能" + SC.QUO + SKILL_NAME + SC.QUO + ",");
        onTrigger();
        remnantCoolingTime = COOL_DOWN;
        if (remnantUsableTimes < Integer.MAX_VALUE) {
            remnantUsableTimes -= 1;
        }
    }

    /**
     * 当技能触发时，具体的技能效果在这里写
     */
    protected abstract void onTrigger();

    /**
     * 当技能更新时，定制的技能更新
     */
    protected abstract void onUpdate();

    /**
     * 当技能初始化时，定制的技能初始化功能，一般在hero里回调
     */
    protected abstract void onInit();
}
